home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / delicious_bookmarks-2.0.64-fx.xpi / chrome / deliciousBookmarks.jar / content / ybMenus.js < prev    next >
Encoding:
JavaScript  |  2008-06-19  |  26.5 KB  |  741 lines

  1. var YB_TYPE_TAG = "http://www.mozilla.org/bookmark#tagvalue";
  2. var YB_TYPE_LIVEMARK = "http://home.netscape.com/NC-rdf#Livemark";
  3. var YB_TYPE_BOOKMARK = "http://home.netscape.com/NC-rdf#Bookmark";
  4. var YB_TYPE_BUNDLE = "http://home.netscape.com/NC-rdf#Bundle";
  5.  
  6. var ybBookmarksMenu = {
  7.   
  8.   _rdfService : null,
  9.   
  10.   _bookmarksStore : null,
  11.   
  12.   _socialStore : null,
  13.   
  14.   _syncService : null,
  15.   
  16.   _prefs: null,
  17.   
  18.   onLoad: function () {
  19.     try {
  20.       this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
  21.                           getService(Components.interfaces.nsIRDFService);
  22.       
  23.       this._bookmarksStore = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  24.              getService(Components.interfaces.nsIYBookmarksStoreService);
  25.  
  26.       this._socialStore = Components.classes["@yahoo.com/socialstore/delicious;1"].
  27.                             getService(Components.interfaces.nsISocialStore); 
  28.  
  29.       this._syncService = Components.classes["@mozilla.org/ybookmarks-sync-service;1"].
  30.                            getService(Components.interfaces.nsIYBookmarkSyncService);
  31.  
  32.       this._prefs = Components.classes["@mozilla.org/preferences-service;1"].
  33.                      getService(Components.interfaces.nsIPrefBranch);
  34.  
  35.     } catch (e) {
  36.       yDebug.print("ybBookmarksMenu.onLoad(): " + e, YB_LOG_MESSAGE);
  37.     } 
  38.   },
  39.   
  40.   getPrefs: function() {
  41.     if (!this._prefs) {
  42.       this._prefs = Components.classes["@mozilla.org/preferences-service;1"].
  43.                           getService(Components.interfaces.nsIPrefBranch);
  44.     }
  45.     return this._prefs;
  46.   },
  47.   
  48.   createContextMenu: function (aEvent)
  49.   { 
  50.     if (!this._rdfService) {
  51.       this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
  52.                       getService(Components.interfaces.nsIRDFService);
  53.     }
  54.     
  55.     if (!this._bookmarksStore) {
  56.       this._bookmarksStore = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  57.          getService(Components.interfaces.nsIYBookmarksStoreService);
  58.     }
  59.  
  60.     var target = document.popupNode;
  61.     try{ 
  62.       var type = this._bookmarksStore.resolveBookmarkResourceType(this._rdfService.GetResource(target.id));
  63.       if (type != "Bookmark" && type != "Livemark") {
  64.         target.removeAttribute("open");
  65.         return false;
  66.       }
  67.       this._contextMenuEnableOpen(target);    
  68.     }
  69.     catch(e) {
  70.         
  71.       var url = target.getAttribute("url");
  72.       if (!url) {
  73.         target.removeAttribute("open");
  74.         return false;
  75.       }
  76.       this._contextMenuEnableOpen(target);
  77.     }
  78.  
  79.     // close flyout menu if open...
  80.     if (type == "Livemark" && target.firstChild.hidePopup) {
  81.       target.firstChild.hidePopup();
  82.     }
  83.         
  84.     return true;
  85.   },
  86.   
  87.   _contextMenuEnableOpen: function (aMenu) 
  88.   {
  89.     var openInWindow = document.getElementById("yb-bookmarks-context-menu-open-in-window");
  90.     var openInNewWindow = document.getElementById("yb-bookmarks-context-menu-open-in-new-window");
  91.     var openInNewTab = document.getElementById("yb-bookmarks-context-menu-open-in-new-tab");
  92.     var openInTabs = document.getElementById("yb-bookmarks-context-menu-open-in-tabs");
  93.     var refreshLivemark = document.getElementById("yb-bookmarks-context-menu-refresh-livemark");
  94.  
  95.     var container = aMenu.getAttribute("container");
  96.     var livemark = aMenu.getAttribute("livemark");
  97.     
  98.     if (container || livemark) {
  99.       openInWindow.hidden = true;
  100.       openInNewWindow.hidden = true;
  101.       openInNewTab.hidden = true;
  102.       openInTabs.hidden = false;
  103.       refreshLivemark.hidden = false;
  104.  
  105.     } else {
  106.       openInWindow.hidden = false;  
  107.       openInNewWindow.hidden = false;
  108.       openInNewTab.hidden = false;
  109.       openInTabs.hidden = true;  
  110.       refreshLivemark.hidden = true;
  111.     }
  112.   },
  113.  
  114.   destroyContextMenu: function (aEvent)
  115.   {
  116.     if (content)
  117.       content.focus();
  118.     
  119.     //XXX: close the toolbarbutton menupopup in the tag view
  120.     var target = document.popupNode;  
  121.     if (target.nodeName == "menuitem") {
  122.        var parent = target.parentNode;
  123.        while (parent) {       
  124.          if (parent.nodeName == "toolbarbutton") {           
  125.           this.closeMenuPopup(parent);
  126.          break;
  127.          }
  128.          
  129.          parent = parent.parentNode;
  130.        }
  131.      }
  132.   },
  133.   
  134.   editBookmark : function (aEvent) {
  135.   
  136.     var url = document.popupNode.getAttribute("url");
  137.     setTimeout(function(url) { yAddBookMark.open(url); }, 0, url);
  138.   },
  139.   
  140.   deleteBookmark : function (url) {
  141.     try {
  142.         if (!this._syncService) {
  143.           this._syncService = Components.classes["@mozilla.org/ybookmarks-sync-service;1"].
  144.                                      getService(Components.interfaces.nsIYBookmarkSyncService);
  145.         }
  146.         
  147.         if (!this._socialStore) {
  148.           this._socialStore = Components.classes["@yahoo.com/socialstore/delicious;1"].
  149.                   getService(Components.interfaces.nsISocialStore); 
  150.         }
  151.     
  152.     
  153.         if( !YBidManager.isUserLoggedIn() ) {
  154.            YBidManager.promptUserLogin();
  155.            try {
  156.               if (window.ybLoginWindowFlag == "display") {
  157.                  YBPopupWindow.showLoginWindow();
  158.               }
  159.            } catch(e) {
  160.                 // do nothing
  161.            }
  162.            return;
  163.         }
  164.     
  165.         if (!url) { // menu and toolbar; sidebar passes in the url
  166.           var target = document.popupNode;
  167.           url = target.getAttribute("url");
  168.           this.destroyContextMenu();
  169.         }
  170.         
  171.         var warnCheck = this.getPrefs().getBoolPref("extensions.ybookmarks@yahoo.bookmark.delete.warn");
  172.         if (warnCheck) {
  173.           var strings = document.getElementById("ybookmarks-strings");
  174.           var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
  175.                  getService(Components.interfaces.nsIPromptService);
  176.           var text = strings.getString("extensions.ybookmarks.bookmark.delete.text");
  177.           var warn = strings.getString("extensions.ybookmarks.bookmark.delete.warn");
  178.           var warnCheck = { value: true };
  179.         
  180.           var deleteConfirmed = promptService.confirmCheck(window, "Delicious", text, warn, warnCheck);
  181.     
  182.           if (!warnCheck.value) {
  183.             this.getPrefs().setBoolPref("extensions.ybookmarks@yahoo.bookmark.delete.warn", false);
  184.           }
  185.           
  186.           if (!deleteConfirmed) {
  187.             return;
  188.           }
  189.       
  190.         }
  191.         this._bookmarksStore.deleteBookmark(url);
  192.         
  193.         var post = { url : url }; 
  194.         post.wrappedJSObject = post; 
  195.         
  196.         this._bookmarksStore.addTransaction("deleteBookmark", 0, post);
  197.         this._syncService.processTransactions();
  198.     }
  199.     catch(e) {
  200.         yDebug.print("ybmenus.js:ybBookmarksMenu::deleteBookmark - Exception: "+e, YB_LOG_MESSAGE);
  201.     }
  202.   },
  203.  
  204.    isBookmarksContainer: function (aTarget) {
  205.     return aTarget.localName == "menu"          || 
  206.            aTarget.localName == "toolbarbutton" &&
  207.            aTarget.getAttribute("type") == "menu";
  208.    },
  209.    
  210.    closeMenuPopup: function (aNode) {
  211.      
  212.      var parent = aNode;
  213.      while (parent) {
  214.        if (this.isBookmarksContainer(parent))
  215.          break;
  216.        parent = parent.parentNode;
  217.      }
  218.      if (parent && parent.getAttribute("open") == "true") {
  219.        if(parent.lastChild.nodeName != "template") {
  220.          parent.lastChild.hidePopup();
  221.        }
  222.        var mParentNode = parent.parentNode;
  223.        while (mParentNode) {
  224.          if (this.isBookmarksContainer(mParentNode))
  225.            break;
  226.          mParentNode = mParentNode.parentNode;
  227.        }  
  228.        if (mParentNode)
  229.          this.closeMenuPopup(mParentNode);
  230.      }
  231.    },
  232.  
  233.    newBookmark: function( event ) {
  234.       yAddBookMark.open( "", "", null, null, null, null, true );
  235.    },
  236.  
  237.    refreshLivemark: function() {
  238.       ybookmarksMain.gBookmarks.reloadLivemark(document.popupNode.getAttribute("url"));
  239.    },
  240.    
  241.    
  242.     /**
  243.       * Create the menuitem used for the toolbars and the del.icio.us menu.  It accepts an object that contains 
  244.       * the relevent info (name, url, etc).
  245.       *
  246.       * Universal
  247.       * ---------
  248.       * type: YB_TYPE_TAG | YB_TYPE_LIVEMARK | YB_TYPE_BUNDLE
  249.       * name : string
  250.       * url: string
  251.       *
  252.       * Optional
  253.       * --------
  254.       * icon: icon resource
  255.       * bundle: boolean - whether it's a bundle menu or not
  256.       * overflow: boolean - whether it's an overflow menu or not, and to use bookmarks accordingly
  257.       *     bookmarks : array of bookmarks - used for caching overflows
  258.       * menubar: boolean - indicates if this is for the the del menu
  259.       * favoriteTag: boolean - indicates whether is a favorite tag
  260.       * livemark : boolean - indicates if is a bookmark coming off of a livemark
  261.       * order: the order of the menu
  262.       *
  263.       * Returns a menu or menuitem depending on the paramemters
  264.       */
  265.      createMenuItem: function(aItem) {
  266.        var menuItem;
  267.        if (aItem.type == YB_TYPE_TAG || aItem.type == YB_TYPE_LIVEMARK || aItem.type == YB_TYPE_BUNDLE) {
  268.          menuItem = document.createElementNS(gYBXUL_NS, "menu");
  269.          menuItem.setAttribute("container", true);
  270.          var popup = document.createElement("menupopup");
  271.  
  272.          if (aItem.type == YB_TYPE_LIVEMARK) {
  273.            menuItem.setAttribute("livemark", true);
  274.            menuItem.setAttribute("class", "menu-iconic bookmark-item");
  275.            popup.setAttribute("onpopupshowing", "if (event.target == this) { ybBookmarksMenu.createLivemarkMenu(event.target); }");
  276.            popup.setAttribute("onpopuphiding", "if (event.target == this) { ybBookmarksMenu.destroyLivemarkMenu(event); }");
  277.          } else if (aItem.type == YB_TYPE_TAG) {
  278.            menuItem.setAttribute("class", "menu-iconic yb-tag-item");
  279.            popup.setAttribute("onpopupshowing", "if (event.target == this) { ybBookmarksMenu.createTagMenu(event.target); }");
  280.            popup.setAttribute("onpopuphiding", "if (event.target == this) { ybBookmarksMenu.destroyTagMenu(event); }");
  281.            if (aItem.bundle) {
  282.              menuItem.setAttribute("bundle", true);
  283.            } else if (aItem.overflow) {
  284.              menuItem.setAttribute("overflow", true);
  285.              menuItem.bookmarks = aItem.bookmarks;
  286.            }
  287.            
  288.            if (aItem.menubar) {
  289.              popup.setAttribute("onpopupshowing", "if (event.target == this) { ybBookmarksMenu.createTagMenu(event.target); ybookmarks_Main.addPopularPageMenuItem(event.target);}");
  290.              
  291.            }
  292.            if (aItem.favoriteTag) {
  293.              menuItem.setAttribute("favoriteTag", true);
  294.            }
  295.            
  296.          } else if (aItem.type == YB_TYPE_BUNDLE) {
  297.            menuItem.setAttribute("class", "menu-iconic yb-bundle-item");
  298.            popup.setAttribute("onpopupshowing", "if (event.target == this) { ybBookmarksMenu.createBundleMenu(event.target); }");
  299.            popup.setAttribute("onpopuphiding", "if (event.target == this) { ybBookmarksMenu.destroyBundleMenu(event); }");
  300.          }
  301.          
  302.          menuItem.appendChild(popup);
  303.        } else {
  304.          menuItem = document.createElementNS(gYBXUL_NS, "menuitem");
  305.          menuItem.setAttribute("class", "menuitem-iconic bookmark-item");  
  306.          if (aItem.livemark) {
  307.            menuItem.setAttribute("livemark", true);
  308.          }
  309.          menuItem.setAttribute("oncommand", "if (event.target == this) { ybookmarksUtils.openBookmark(event); }");
  310.          menuItem.setAttribute("onclick", "if (event.target == this && event.button == 1) { ybookmarksUtils.openBookmark(event); }");
  311.          if (ybookmarksUtils.getPlatform() != YB_PLATFORM_MAC) {
  312.            menuItem.setAttribute("context", "yb-bookmarks-context-menu");
  313.          }
  314.        }
  315.        menuItem.setAttribute("label", aItem.name);
  316.        if (aItem.url) {
  317.          menuItem.setAttribute("url", aItem.url );
  318.          menuItem.setAttribute("statustext", aItem.url);
  319.          
  320.        }
  321.        menuItem.setAttribute("tooltip", "ybToolbar-tooltip");
  322.  
  323.        if (aItem.icon) {
  324.          menuItem.setAttribute("image", aItem.icon);
  325.        }
  326.  
  327.        menuItem.setAttribute("type", aItem.type);
  328.        
  329.        if (aItem.order) {
  330.            menuItem.setAttribute("order", aItem.order);
  331.         }
  332.      
  333.      /* ******* leaving this checked in, as it can be turned on quickly *******
  334.          if( aItem.shared == "false" ) {
  335.            menuItem.setAttribute( "class", menuItem.getAttribute( "class" ) + " private-bookmark" );
  336.          }
  337.      */
  338.       return menuItem;
  339.      },
  340.  
  341.      /*
  342.       * Takes an array of bookmarks and the favorite tag of the menu,
  343.       * then calculate the apporpriate overflow menus
  344.       *
  345.       * Returns [ tagInfo*, topLevel ]
  346.       *
  347.       * tagInfo: { tag: string of tag
  348.       *            bm: [ bookmarks* ] }
  349.       *          Each tagInfo entry represents one overflow menu. tagInfo.bm is used to cache
  350.       *          the contents of the overflow menu by createMenuItem()          
  351.       *
  352.       * topLevel: [ bookmarks ]
  353.       *         topLevel is just an array of the bookmarks that should reside in the toplevel 
  354.       */
  355.      _calcTagMenuOverflow: function(aBookmarks, aTag) {
  356.        try {
  357.  
  358.         // return bm's tags - omitTags
  359.          var _getTags = function(bm, omitTags) {
  360.            var _arrayContains = function(aArray, aItem){
  361.              for (var i=0; i < aArray.length; i++) {
  362.                if (aArray[i] == aItem) {
  363.                  return true;
  364.                }
  365.              }
  366.              return false;
  367.            };
  368.            var jsTags = ybookmarksUtils.nsArrayToJs(bm.tags);
  369.            var res = [];
  370.  
  371.            for (var i=0; i < jsTags.length; i++) {
  372.              var tag = jsTags[i].toLowerCase();
  373.              if (!_arrayContains(omitTags, tag)) {
  374.                res.push(tag);  
  375.              }
  376.            }
  377.            return res;
  378.          };
  379.  
  380.          // make a lookup table of tag->[bookmark+]
  381.          var omitTags = aTag.toLowerCase().split("+");
  382.          var tagsLookup = {};
  383.          
  384.          for (var k=0; k< aBookmarks.length; k++ ) {
  385.            var bm = aBookmarks[k];
  386.            var bmTags = _getTags(bm, omitTags);
  387.            for(var m=0; m <bmTags.length; m++) {
  388.              var t = bmTags[m];
  389.              if (tagsLookup[t]) {
  390.                tagsLookup[t].push(bm);
  391.              } else {
  392.                tagsLookup[t] =  [ bm ];
  393.              }
  394.            }
  395.          }
  396.  
  397.          // make an array of { tag: String,
  398.          //                     bm: [ bookmarks+ ] }
  399.          var tagsLookupArray = [];
  400.          for (var tag in tagsLookup) {
  401.            tagsLookupArray.push({tag: tag,
  402.                                  bm: tagsLookup[tag]});
  403.          }  
  404.          tagsLookupArray.sort(function(a,b) { 
  405.                                var res = b.bm.length - a.bm.length;
  406.                                if (res == 0) {
  407.                                  res = a.tag.localeCompare(b.tag);
  408.                                }
  409.                                return res;
  410.                              });
  411.          /*
  412.          for (var i=0; i < tagsLookupArray.length; i++) {
  413.            var tag = tagsLookupArray[i];
  414.            yDebug.print("tag: " + tag.tag + " #: " + tag.bm.length);
  415.          }*/
  416.  
  417.         var maxOverflowMenus = this.getPrefs().getIntPref("extensions.ybookmarks@yahoo.tagsview.overflow.spillover.max"); 
  418.         var minSpilloverSize = this.getPrefs().getIntPref("extensions.ybookmarks@yahoo.tagsview.overflow.spillover.minsize");
  419.         var removeFromTopLevel = this.getPrefs().getBoolPref("extensions.ybookmarks@yahoo.tagsview.overflow.remove_from_toplevel");
  420.        
  421.          var limit = tagsLookupArray.length < maxOverflowMenus ? tagsLookupArray.length : maxOverflowMenus;
  422.  
  423.          var result = [];
  424.          
  425.          for (var i=0; i < limit; i++) {
  426.            var tag = tagsLookupArray[i];
  427.            if (tag.bm.length >= minSpilloverSize) {
  428.              result.push(tag);
  429.            }
  430.          }
  431.          //var result = tagsLookupArray.slice(0, limit);
  432.  
  433.          var overflowedDB = {};
  434.          // mark overflowed bookmarks in aBookamrks
  435.          for (var i=0; i < result.length; i++) {
  436.            var bms = result[i].bm;
  437.            for (var j=0; j < bms.length; j++) {
  438.              overflowedDB[bms[j].url] = true;
  439.            }
  440.          }
  441.  
  442.          if (removeFromTopLevel) {
  443.            var leanBookmarks = [];
  444.            for (var i=0; i< aBookmarks.length; i++ ) {
  445.              var bm = aBookmarks[i];
  446.              if (overflowedDB[bm.url]) {
  447.                continue;
  448.              } else {
  449.                leanBookmarks.push(bm);
  450.              }
  451.            }
  452.            result.push(leanBookmarks);
  453.          } else {
  454.            result.push(aBookmarks);
  455.          }
  456.          return result;
  457.  
  458.        } catch (e) { 
  459.          yDebug.print("_calcTagMenuOverflow(): " + e);
  460.        }
  461.      },
  462.      
  463.      createTagMenu: function(menu) {
  464.        try {
  465.        var tag = menu.parentNode.getAttribute("label");
  466.        if (!tag) { return; }
  467.        while(menu.childNodes.length > 0) {
  468.          menu.removeChild(menu.childNodes[0]);
  469.        }
  470.  
  471.        var bookmarks;
  472.        var order;
  473.        if (menu.parentNode.getAttribute("bundle")) {
  474.          order = menu.parentNode.getAttribute("order");
  475.          bookmarks = ybookmark_Utils.getBookmarksForTag(tag);
  476.          ybBags.sortBookmarks(bookmarks, order);
  477.        } else if (menu.parentNode.getAttribute("overflow")){
  478.          bookmarks = menu.parentNode.bookmarks;
  479.          order = menu.parentNode.getAttribute("order");
  480.        } else if (menu.parentNode.getAttribute("favoriteTag")) {
  481.          order = ybBags.getFavoriteTagOrder(tag);
  482.          bookmarks = ybBags.getBookmarksFromFavoriteTag(tag, order);
  483.        } else {
  484.          order = FAVTAGS_ORDER_ALPHANUM;
  485.          bookmarks = ybBookmarksMenu._bookmarksStore.getBookmarks(tag, {});
  486.        }
  487.  
  488.        if (this.getPrefs().getBoolPref("extensions.ybookmarks@yahoo.tagsview.overflow.enable")) {
  489.          if (bookmarks.length > this.getPrefs().getIntPref("extensions.ybookmarks@yahoo.tagsview.overflow.level") 
  490.              && !menu.parentNode.getAttribute("overflow")) {
  491.           try {
  492.            var overflow = this._calcTagMenuOverflow(bookmarks, tag);
  493.  
  494.            for (var i=0; i <overflow.length-1; i++) {
  495.              var tagArg = { name: overflow[i].tag,
  496.                                url: "",
  497.                                icon: "",
  498.                                overflow: true,
  499.                                type: YB_TYPE_TAG,
  500.                                order: order,
  501.                                bookmarks: overflow[i].bm};
  502.              var tagItem = this.createMenuItem(tagArg);
  503.              menu.appendChild(tagItem);
  504.            }
  505.            bookmarks = overflow[overflow.length-1];
  506.            } catch (e) {
  507.             yDebug.print("Error calculating tagoverflows: " + e);
  508.            }
  509.          }
  510.       
  511.        }
  512.  
  513.        for (var i=0; i<bookmarks.length; i++) {
  514.          var bm = bookmarks[i];
  515.  
  516.          if (bm.type == YB_TYPE_LIVEMARK) {
  517.            var newBm = {};
  518.            for (var prop in bm) {
  519.              newBm[prop] = bm[prop];
  520.            }
  521.            newBm.order = order;
  522.            bm = newBm;
  523.            //item.setAttribute("order", "chrono");
  524.          }    
  525.          var bmItem = this.createMenuItem(bm);
  526.          menu.appendChild(bmItem);
  527.        }
  528.  
  529.        if (bookmarks.length > 1) {
  530.          YBtabsOpener.addMenuItem(menu);
  531.        } else if (bookmarks.length == 0) {
  532.          menu.appendChild(this.createEmptyMenuItem());
  533.        } 
  534.      } catch (e) { 
  535.        yDebug.print("createTagMenu(): " + e, YB_LOG_MESSAGE);
  536.      }
  537.      },
  538.  
  539.      destroyTagMenu: function(event) {
  540.        if (content) {
  541.          content.focus();
  542.        }
  543.      },
  544.      createLivemarkMenu: function(menu) {
  545.        try {
  546.        var url = menu.parentNode.getAttribute("url");
  547.       
  548.        while(menu.childNodes.length > 0) {
  549.          menu.removeChild(menu.childNodes[0]);
  550.        }
  551.   
  552.        var order = menu.parentNode.getAttribute("order");
  553.        var bookmarks = ybookmarksMain.gBookmarks.getBookmarksForLivemark(url, {});
  554.        //ybBags.sortBookmarks(bookmarks, FAVTAGS_ORDER_CHRONO); // this is actually reverse chrono since livemark items are stacked 
  555.        var numItems = 0;
  556.  
  557.        for (var i=0; i < bookmarks.length; i++) {
  558.          var bm = bookmarks[i];
  559.  
  560.          var arg = {name: bm.name,
  561.                      url: bm.url,
  562.                      icon: "",
  563.                      type: YB_TYPE_BOOKMARK,
  564.                      livemark: true};
  565.          var bmItem = this.createMenuItem(arg);
  566.  
  567.          menu.appendChild(bmItem);
  568.       
  569.          numItems++;
  570.        }
  571.        if (numItems > 1) {
  572.          YBtabsOpener.addMenuItem(menu);
  573.        } else if (numItems == 0) {
  574.          menu.appendChild(this.createEmptyMenuItem());
  575.        }
  576.        } catch(e) { yDebug.print(e); }
  577.  
  578.      },
  579.  
  580.      destroyLivemarkMenu: function(event) {
  581.        if (content) {
  582.          content.focus();
  583.        }
  584.      },
  585.  
  586.      createBundleMenu: function(menu) {
  587.        try {
  588.        var bundleName = menu.parentNode.getAttribute("label");
  589.        var bundle = ybookmarksUtils.nsBundleToJs(ybookmarksMain.gBookmarks.getBundle(bundleName));
  590.        var order = menu.parentNode.getAttribute("order");
  591.        var tags = bundle.tags;
  592.        var bundleMenuIncludeBookmarks = this.getPrefs().getBoolPref("extensions.ybookmarks@yahoo.bundles.menu.include_bookmarks");
  593.       
  594.        while(menu.childNodes.length > 0) {
  595.          menu.removeChild(menu.childNodes[0]);
  596.        }
  597.       
  598.        if ( (bundleMenuIncludeBookmarks && tags.length > 1) ||
  599.             (!bundleMenuIncludeBookmarks && tags.length >= 1) ) {    
  600.          for (var i=0; i < tags.length; i++) {
  601.            var tag = tags[i];
  602.            if (tag) {
  603.               if (ybBookmarksMenu._bookmarksStore.getTotalBookmarksForTag(tag) > 0) {
  604.                var tagArg = { name: tag,
  605.                               url: "",
  606.                               icon: "",
  607.                               type: YB_TYPE_TAG,
  608.                               bundle: true,
  609.                               order: order};
  610.  
  611.                var menuitem = this.createMenuItem(tagArg);
  612.                menu.appendChild(menuitem);
  613.              }
  614.            }
  615.          }
  616.        } 
  617.  
  618.        if (bundleMenuIncludeBookmarks) {
  619.          //menu.appendChild(document.createElementNS(gYBXUL_NS, "menuseparator"));
  620.  
  621.          var bookmarks = [];
  622.          for(var i=0; i < tags.length; i++) {
  623.            bookmarks = bookmarks.concat(ybookmark_Utils.getBookmarksForTag(tags[i]));
  624.          }
  625.          bookmarks = ybookmarksUtils.uniqueBookmarkArray(bookmarks);
  626.          ybBags.sortBookmarks(bookmarks, order);
  627.  
  628.          for (var i=0; i<bookmarks.length; i++) {
  629.            var bm = bookmarks[i];
  630.            if (bm.type == YB_TYPE_LIVEMARK) {
  631.              var newBm = {};
  632.              for (var prop in bm) {
  633.                newBm[prop] = bm[prop];
  634.              }
  635.              newBm.order = FAVTAGS_ORDER_DEFAULT;
  636.              bm = newBm;
  637.            }    
  638.            var bmItem = this.createMenuItem(bm);
  639.            menu.appendChild(bmItem);
  640.          }
  641.        }
  642.  
  643.       if (menu.childNodes.length == 0 ) {
  644.          menu.appendChild(ybBookmarksMenu.createEmptyMenuItem());
  645.       }
  646.  
  647.        } catch (e) { 
  648.          yDebug.print("ybBookmarksMenu.createBundleMenu(): " + e);
  649.        }
  650.      },
  651.  
  652.      destroyBundleMenu: function(event) {
  653.        if (content) {
  654.          content.focus();
  655.        }
  656.      },
  657.  
  658.      createEmptyMenuItem: function () {
  659.        var item = document.createElementNS(gYBXUL_NS, "menuitem"); 
  660.        item.setAttribute("label", document.getElementById(YB_STRINGS_BOOKMARKS).getString("emptyFolder"));
  661.        item.setAttribute("disabled", true);
  662.  
  663.        return item;
  664.      }
  665.  
  666.  
  667.  
  668. };
  669.  
  670. var ybContextMenu = {
  671.  
  672.    register : function(){
  673.   
  674.      var menu = document.getElementById("contentAreaContextMenu");
  675.      if(menu){
  676.          menu.addEventListener("popupshowing", this.setup, false);
  677.      }
  678.    
  679.      //hidden menuitems
  680.      try {  
  681.        document.getElementById("yb-context-tagCurrent-aftersearch").hidden = true;
  682.        document.getElementById("yb-context-tagCurrent").hidden = true;
  683.        document.getElementById("yb-context-tagLink").hidden = true; 
  684.      } catch(e){
  685.        yDebug.print(e, YB_LOG_MESSAGE);
  686.      }
  687.    },
  688.       
  689.    unregister : function(){
  690.    
  691.      var menu = document.getElementById("contentAreaContextMenu");
  692.      if(menu){
  693.          menu.removeEventListener("popupshowing", this.setup, false);
  694.      }
  695.      try {
  696.      //hidden menuitems
  697.      document.getElementById("yb-context-tagCurrent-aftersearch").hidden = true;     
  698.      document.getElementById("yb-context-tagCurrent").hidden = true;
  699.      document.getElementById("yb-context-tagLink").hidden = true;
  700.     } catch(e) {
  701.       yDebug.print(e, YB_LOG_MESSAGE);
  702.     }
  703.    },
  704.    
  705.    setup : function(){
  706.        var prefs = Components.classes["@mozilla.org/preferences-service;1"].
  707.                               getService(Components.interfaces.nsIPrefBranch);
  708.        if (this.hideFFBMMenu === undefined) {         
  709.          this.hideFFBMMenu = false;
  710.          try {
  711.             this.hideFFBMMenu = prefs.getBoolPref("extensions.ybookmarks@yahoo.original.ui.hide");
  712.          } catch ( e ) { }
  713.        }
  714.        if (this.hideYBContextMenu === undefined) {
  715.          this.hideYBContextMenu = false;
  716.          try {
  717.             this.hideYBContextMenu = prefs.getBoolPref("extensions.ybookmarks@yahoo.contextmenu.hide");
  718.          } catch ( e ) { }
  719.        }     
  720.    
  721.        if(gContextMenu){
  722.          
  723.          gContextMenu.showItem("yb-context-tagCurrent-aftersearch",  gContextMenu.isTextSelected);
  724.          gContextMenu.showItem("yb-context-tagCurrent",  !gContextMenu.isTextSelected && !( gContextMenu.isContentSelected || gContextMenu.onTextInput || gContextMenu.onLink || gContextMenu.onImage ));
  725.          gContextMenu.showItem("yb-context-tagLink", gContextMenu.onLink && !gContextMenu.onMailtoLink );
  726.          gContextMenu.showItem("yb-context-keywordfield", gContextMenu.onTextInput && gContextMenu.onKeywordField );         
  727.          if (this.hideFFBMMenu) {
  728.             document.getElementById("context-keywordfield").hidden = true;
  729.          }
  730.          if (this.hideYBContextMenu) {
  731.             document.getElementById("yb-context-tagCurrent-aftersearch").hidden = true;
  732.             document.getElementById("yb-context-tagCurrent").hidden = true;
  733.             document.getElementById("yb-context-tagLink").hidden = true;
  734.             document.getElementById("yb-context-keywordfield").hidden = true;
  735.          }
  736.        }
  737.    } 
  738. };
  739.  
  740. window.addEventListener("load", function() { try { ybBookmarksMenu.onLoad(); } catch(e) { dump("BOOOOOOO: " + e);} }, false);
  741.